// 最长上升子序列

//#include <bits/stdc++.h>
#include <iostream>
using namespace std;

int a[1000]; // 原始序列
int F[1000]; // 第i位的最长上升子序列的长度

// 举例：
// a[]:   5 2 8 4 6 1 3 9 7
// L[]: x 1 3 6 7 0 0 0 0 0 长度为i的上升子序列中末端的最小值，这是个递增序列

int main()
{
    int n;
    cin >> n;

    cin >> a[0];
    F[1] = a[0]; // 长度为1的LIS的最小末端值是a[0]

    // 数组F中的最右边元素的下标就是LIS的长度
    // 其值F[ans]是符合该长度所有LIS序列的末端最小值
    int ans = 1;

    for(int i=1; i<n; i++)
    {
        cin >> a[i];

		if(a[i] > F[ans])
		{
		    F[++ans] = a[i];
		    continue;
		}

		// 二分法，找到当前元素a[i]应存入的位置
		// L[]: x 1 3 6 7 0 0 0
		//        l   m   r
		int left  = 1;
		int right = ans;
		int mid   = (left+right)/2;
		while(left<mid && mid<right)
		{
		    if(a[i] < F[mid])
		    {
		    	right = mid;
				mid   = (left+mid)/2;
		    }
		    else
		    {
		    	left = mid;
				mid  = (mid+right)/2;
		    }
	    }

		F[right] = a[i];
	}

    cout << ans << endl;

    return 0;
}
